package com.jsbs.iam.ident.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.jsbs.iam.common.core.utils.PageHelperTool;
import com.jsbs.iam.ident.dto.UserLogPageDto;
import com.jsbs.iam.ident.entity.IamLoginLog;
import com.jsbs.iam.ident.entity.IamUpdateUserLog;
import com.jsbs.iam.ident.entity.UserLogPage;
import com.jsbs.iam.ident.mapper.IamLoginLogMapper;
import com.jsbs.iam.ident.mapper.IamUpdateUserLogMapper;
import com.jsbs.iam.ident.service.IamUserLogService;
import com.jsbs.iam.ident.vo.IamLoginLogVo;
import com.jsbs.iam.ident.vo.IamUpdateUserLogVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author zhouxiangyang
 * @className UserLogServiceImpl
 * @date 2023/1/5 17:02
 * @description:
 */
@Service
public class UserLogServiceImpl implements IamUserLogService {

    @Autowired
    private IamLoginLogMapper iamLoginLogMapper;

    @Autowired
    private IamUpdateUserLogMapper iamUpdateUserLogMapper;

    @Override
    public PageInfo<IamLoginLogVo> getLoginLogPage(UserLogPageDto pageDto) throws Exception{
        //初始化分页
        pageDto.init();
        PageHelper.startPage(pageDto.getCurrPage(),pageDto.getPageSize());
        UserLogPage userLogPage = convertUserLogPage(pageDto);
        //查询登录日志
        List<IamLoginLog> loginLogPages = iamLoginLogMapper.getLoginLogPage(userLogPage);
        PageInfo<IamLoginLog> page = new PageInfo<>(loginLogPages);
        //entity转vo
        List<IamLoginLogVo> iamLoginLogVos = convertLoginLogVo(loginLogPages);

        PageInfo<IamLoginLogVo> pageInfo = new PageInfo<>(iamLoginLogVos);
        //取总页数
        int total = (int) page.getTotal();
        PageInfo<IamLoginLogVo> loginLogPageInfo = PageHelperTool.initPageInfoObj(
                pageDto.getCurrPage(), total, pageDto.getPageSize(), pageInfo);

        return loginLogPageInfo;
    }

    @Override
    public List<IamLoginLogVo> getLoginLogList(UserLogPageDto pageDto) throws Exception{
        UserLogPage userLogPage = convertUserLogPage(pageDto);
        List<IamLoginLog> loginLogPages = iamLoginLogMapper.getLoginLogPage(userLogPage);
        //entity转vo
        List<IamLoginLogVo> iamLoginLogVos = convertLoginLogVo(loginLogPages);
        return iamLoginLogVos;
    }

    @Override
    public int saveIamLoginLog(IamLoginLog loginLog) {
        int i = iamLoginLogMapper.insertSelective(loginLog);
        return i;
    }

    @Override
    public PageInfo<IamUpdateUserLogVo> getUpdateUserLogPage(UserLogPageDto pageDto) throws Exception {
        //初始化分页
        pageDto.init();
        PageHelper.startPage(pageDto.getCurrPage(),pageDto.getPageSize());
        UserLogPage userLogPage = convertUserLogPage(pageDto);
        //查询修改日志
        List<IamUpdateUserLog> updateUserLogPages = iamUpdateUserLogMapper.getUpdateUserLogPage(userLogPage);
        PageInfo<IamUpdateUserLog> page = new PageInfo<>(updateUserLogPages);
        //entity转vo
        List<IamUpdateUserLogVo> iamUpdateUserLogVos = convertUpdateUserLogVo(updateUserLogPages);

        PageInfo<IamUpdateUserLogVo> pageInfo = new PageInfo<>(iamUpdateUserLogVos);
        //取总页数
        int total = (int) page.getTotal();
        PageInfo<IamUpdateUserLogVo> updateUserLogPageInfo = PageHelperTool.initPageInfoObj(
                pageDto.getCurrPage(), total, pageDto.getPageSize(), pageInfo);

        return updateUserLogPageInfo;
    }

    @Override
    public List<IamUpdateUserLogVo> getUpdateUserLogList(UserLogPageDto pageDto) throws Exception {
        UserLogPage userLogPage = convertUserLogPage(pageDto);
        List<IamUpdateUserLog> updateUserLogPages = iamUpdateUserLogMapper.getUpdateUserLogPage(userLogPage);
        List<IamUpdateUserLogVo> iamUpdateUserLogVos = convertUpdateUserLogVo(updateUserLogPages);
        return iamUpdateUserLogVos;
    }

    @Override
    public int saveIamUpdateUserLog(IamUpdateUserLog updateUserLog) {
        int i = iamUpdateUserLogMapper.insertSelective(updateUserLog);
        return i;
    }

    private UserLogPage convertUserLogPage (UserLogPageDto pageDto) throws Exception {
        UserLogPage userLogPage = new UserLogPage();
        String startDate = pageDto.getStartDate();
        String endDate = pageDto.getEndDate();
        if ((StringUtils.isEmpty(startDate) && StringUtils.isNotEmpty(endDate)) ||
                (StringUtils.isNotEmpty(startDate) && StringUtils.isEmpty(endDate))) {
            throw new Exception("起始时间或者终止时间其中一个有值另一个不能为空");
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (StringUtils.isNotEmpty(startDate) && StringUtils.isNotEmpty(endDate)) {
            Date startDe = sdf.parse(startDate);
            Date endDe = sdf.parse(endDate);
            userLogPage.setUserCodeOrName(pageDto.getUserCodeOrName());
            userLogPage.setStartDate(startDe);
            userLogPage.setEndDate(endDe);
        }
        userLogPage.setStatus(pageDto.getStatus());
        userLogPage.setUserCodeOrName(pageDto.getUserCodeOrName());
        return userLogPage;
    }

    private List<IamLoginLogVo> convertLoginLogVo (List<IamLoginLog> loginLogPages) {
        List<IamLoginLogVo> list = new ArrayList<>();
        loginLogPages.forEach(iamLoginLog -> {
            IamLoginLogVo iamLoginLogVo = new IamLoginLogVo();
            BeanUtils.copyProperties(iamLoginLog,iamLoginLogVo);
            //登录状态转换
            Boolean loginStatus = iamLoginLog.getLoginStatus();
            if(loginStatus) {
                iamLoginLogVo.setLoginStatus("成功");
            } else {
                iamLoginLogVo.setLoginStatus("失败");
            }
            //是否异常登录转换
            Boolean isExceptionLogin = iamLoginLog.getIsExceptionLogin();
            if (isExceptionLogin) {
                iamLoginLogVo.setIsExceptionLogin("否");
            } else {
                iamLoginLogVo.setIsExceptionLogin("是");
            }
            Date loginTime = iamLoginLog.getLoginTime();
            //创建时间转换成String
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format = sdf.format(loginTime);
            iamLoginLogVo.setLoginTime(format);
            list.add(iamLoginLogVo);
        });
        return list;
    }

    private List<IamUpdateUserLogVo> convertUpdateUserLogVo (List<IamUpdateUserLog> updateUserLogPages) {
        List<IamUpdateUserLogVo> list = new ArrayList<>();
        updateUserLogPages.forEach(updateUserLog -> {
            IamUpdateUserLogVo updateUserLogVo = new IamUpdateUserLogVo();
            BeanUtils.copyProperties(updateUserLog,updateUserLogVo);
            //修改状态转换
            Boolean updateStatus = updateUserLog.getUpdateStatus();
            if(updateStatus) {
                updateUserLogVo.setUpdateStatus("成功");
            } else {
                updateUserLogVo.setUpdateStatus("失败");
            }
            Date modifyTime = updateUserLog.getModifyTime();
            //创建时间转换成String
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format = sdf.format(modifyTime);
            updateUserLogVo.setModifyTime(format);
            list.add(updateUserLogVo);
        });
        return list;
    }
}
